package cn.wubo.file.storage.demo;

import cn.wubo.file.storage.core.FileInfo;
import cn.wubo.file.storage.core.FileStorageService;
import cn.wubo.file.storage.core.MultipartFileStorage;
import cn.wubo.file.storage.utils.IoUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Objects;

@Controller
public class Demo2Controller {

    @Autowired
    FileStorageService fileStorageService;

    /**
     * 测试用平台别名
     **/
    //private String alias = "local-1";
    private String alias = "minio-1";
    //private String alias = "webDAV-1";
    //private String alias = "git-1";
    //private String alias = "amazonS3-1";

    /**
     * 上传文件列表
     *
     * @param model    模型对象
     * @param fileInfo 文件信息对象
     * @return 返回视图名称
     */
    @PostMapping(value = "/demo2")
    public String demo2(Model model, FileInfo fileInfo) {
        // 获取文件存储记录列表
        model.addAttribute("list", fileStorageService.list(fileInfo));
        // 设置查询参数
        model.addAttribute("query", fileInfo);
        return "demo2";
    }

    /**
     * 上传文件
     *
     * @param file  上传的文件
     * @param model 模型对象
     * @return 返回上传结果页面
     */
    @PostMapping(value = "/upload")
    public String upload(MultipartFile file, Model model) {
        // 保存上传的文件
        fileStorageService.save(new MultipartFileStorage(file).setAlias(alias).setPath("/ttt"));

        // 获取文件列表
        FileInfo fileInfo = new FileInfo();
        model.addAttribute("list", fileStorageService.list(fileInfo));

        // 设置查询条件
        model.addAttribute("query", fileInfo);

        // 返回上传结果页面
        return "demo2";
    }

    /**
     * 获取文件列表
     *
     * @param model 模型对象
     * @return 返回页面名称
     */
    @GetMapping(value = "/demo2")
    public String demo2(Model model) {
        // 创建文件信息对象
        FileInfo fileInfo = new FileInfo();
        // 获取文件存储记录列表
        List<FileInfo> list = fileStorageService.list(fileInfo);
        // 将文件存储记录列表和文件信息对象添加到模型对象中
        model.addAttribute("list", list);
        model.addAttribute("query", fileInfo);
        // 返回页面名称
        return "demo2";
    }

    /**
     * 删除文件
     *
     * @param req   请求对象
     * @param model 模型对象
     * @return 返回页面名称
     */
    @GetMapping(value = "/delete")
    public String delete(HttpServletRequest req, Model model) {
        // 获取要删除的文件id
        String id = req.getParameter("id");
        // 调用文件存储服务删除文件
        fileStorageService.delete(id);
        // 创建文件信息对象
        FileInfo fileInfo = new FileInfo();
        // 获取文件存储记录列表
        List<FileInfo> list = fileStorageService.list(fileInfo);
        // 将文件存储记录列表和文件信息对象添加到模型对象中
        model.addAttribute("list", list);
        model.addAttribute("query", fileInfo);
        // 返回页面名称
        return "demo2";
    }

    /**
     * 下载文件
     *
     * @param req  请求对象
     * @param resp 响应对象
     */
    @GetMapping(value = "/download")
    public void download(HttpServletRequest req, HttpServletResponse resp) {
        String id = req.getParameter("id");
        MultipartFileStorage file = fileStorageService.download(id);
        resp.reset();
        resp.setContentType(file.getContentType());
        resp.addHeader("Content-Length", String.valueOf(file.getSize()));
        try (OutputStream os = resp.getOutputStream()) {
            resp.addHeader("Content-Disposition", "attachment;filename=" + new String(Objects.requireNonNull(file.getOriginalFilename()).getBytes(), StandardCharsets.ISO_8859_1));
            IoUtils.writeToStream(file.getBytes(), os);
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }
}
